with Ada.Text_Io; use Ada.Text_Io;
with Dictionnaires;
with Ada.Command_Line;

procedure Demonstration is

   Taille: constant Positive := 5;

   function Hash_Somme(Mot: String) return Natural is
      S: Natural := 0;
   begin
      for I in Mot'Range loop
         S:=S+Character'Pos(Mot(i));
      end loop;
      return S;
   end Hash_Somme;

   package Dico_Hash_Somme is new Dictionnaires(Taille, True, Hash_Somme);

   Fich: File_Type; -- fichier de test contenant un dictionnaire
   -- dictionnaire :
   Dhb: Dico_Hash_Somme.Dictionnaire := Dico_Hash_Somme.Cree_Dico;

   Trouve : Boolean;
   laDef : Dico_Hash_Somme.Definition;

begin

   declare -- un nouveau bloc
         S: String := "dico_gros.txt";
   begin
      Open(Fich, In_File, S);
   exception
      when Name_Error => Put_Line("fichier inexistant !"); return;
   end;

   -- remplissage du dictionnaire
   Dico_Hash_Somme.Remplit_Dico(Fich, Dhb);
   Dico_Hash_Somme.Put(Dhb);
   Ada.Text_Io.New_Line;

   -- suppresion mot "quatremot"
   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("quatremot"), Trouve, laDef);
   
   if Trouve then
      Ada.Text_Io.Put_Line("quatremot a été supprimé, voici la définition : " & laDef.S);
      Dico_Hash_Somme.Put(Dhb);
   else
      Ada.Text_Io.Put_Line("quatremot n'a pas été trouvé");
   end if;

   -- statistiques de dispersion sur ces dictionnaires
   Ada.Text_Io.New_Line;
   Ada.Text_Io.Put("-- hachage = premiere lettre");
   Dico_Hash_Somme.Dispersion(Dhb);

   Ada.Text_Io.New_Line;

   Dico_Hash_Somme.Trouve(Dhb, Dico_Hash_Somme.Cree_Mot("nawak"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("nawak a été trouvé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("nawak n'a pas été trouvé");
   end if;

   Ada.Text_Io.New_Line;

   Dico_Hash_Somme.Trouve(Dhb, Dico_Hash_Somme.Cree_Mot("deuxmot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("deuxmot a été trouvé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("deuxmot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("vingtetunmot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("vingtetunmot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("vingtetunmot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("vingtmot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("vingtmot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("vingtmot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("dixneufmot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("dixneuf a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("dixneuf n'a pas été trouvé");
   end if;


   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("dixhuitmot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("dixhuitmot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("dixhuitmot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("dixseptmot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("dixseptmot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("dixseptmot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("seizemot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("seizemot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("seizemot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("quinzemot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("quinzemot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("quinzemot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("quatorzemot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("quatorzemot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("quatorzemot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("treizemot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("treizemot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("treizemot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("douzemot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("douzemot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("douzemot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("onzemot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("onzemot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("onzemot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("dixmot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("dixmot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("dixmot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("neufmot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("neufmot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("neufmot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("huitmot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("huitmot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("huitmot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("septmot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("septmot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("septmot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("sixmot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("sixmot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("sixmot n'a pas été trouvé");
   end if;

   Dico_Hash_Somme.Supprime(Dhb, Dico_Hash_Somme.Cree_Mot("cinqmot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("cinqmot a été supprimé, voici la définition : " & laDef.S);
   else
      Ada.Text_Io.Put_Line("cinqmot n'a pas été trouvé");
   end if;

   Ada.Text_Io.New_Line;

   Ada.Text_Io.Put_Line("La table de hachage a été vidée");
   Dico_Hash_Somme.Vider(Dhb);

   -- statistiques de dispersion sur ces dictionnaires
   Ada.Text_Io.New_Line;
   Ada.Text_Io.Put("-- hachage = premiere lettre");
   Dico_Hash_Somme.Dispersion(Dhb);

   Ada.Text_Io.New_Line;

   Dico_Hash_Somme.Put(Dhb);

   -- fermeture du fichier test
   Close(Fich);

end Demonstration;
